/*
 * atributo.java
 *
 * Created on 5 de Maio de 2007, 20:56
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor. 
 */

package org.jerm.Mapeamento.Atributos;
import java.util.ArrayList;
import java.lang.Exception;


/**
 * Classe de Atributos do tipo Decimal e Numeric. 
 * Os tipos s�o identicos e ser�o representados como Decimal. 
 * <BR>Possui: 
 * Nome, 
 * Tipo, 
 * Unico, 
 * Padrao, 
 * Nulo, 
 * Unsigned, 
 * Zerofill. 
 * 
 * <BR>Implementa: 
 * Tamanho, 
 * Precisao. 
 *
 * @author Tiago Falcao
 * @version 1.0b 15/05/07
 */
public class AtributoDecimal extends AtributoNumero{
    /**
     * Numero Maximo de Digitos
     */
    protected int Tamanho;        //Se Atributo nao pode repetido
    /**
     * Numero Maximo de Digitos Decimais
     */
    protected int Precisao;        //Se Atributo nao pode repetido
    
    /**
     * Cria nova instancia de Atributo Decimal
     */
    public AtributoDecimal()
    {
        super();
        this.Tamanho=0;
        this.Precisao=0;
    }
    
    public void loadArray(Object[] o){
        if(o.length!=13)
            return;
        Nome=(String)o[0];
        Tipo=(String)o[1];
        Unico=((Boolean)o[2]).booleanValue();
        Padrao=(String)o[3];
        Nulo=((Boolean)o[4]).booleanValue();
        Unsigned=((Boolean)o[5]).booleanValue();
        Zerofill=((Boolean)o[6]).booleanValue();
        Tamanho=((Integer)o[7]).intValue();
        Precisao=((Integer)o[8]).intValue();
        MultiValorado=((Boolean)o[12]).booleanValue();
        
    }
    
    public Object[] getArray(){
        Object[] o=new Object[13];
        o[0]=Nome;
        o[1]=Tipo;
        o[2]=new Boolean(Unico);
        o[3]=Padrao;
        o[4]=new Boolean(Nulo);
        o[5]=new Boolean(Unsigned);
        o[6]=new Boolean(Zerofill);
        o[7]=new Integer(Tamanho);
        o[8]=new Integer(Precisao);
        o[9]=new String();
        o[10]=new String();
        o[11]=new String();
        o[12]=new Boolean(MultiValorado);
        return o;
    }
    
    /**
     * Atribui o Tipo ao Atributo
     * @param Tipo Tipo do atributo
     * @throws java.lang.Exception Se Tipo for diferente de Decimal e Numeric
     */
    public void setTipo(String Tipo) throws Exception
    {
        Tipo=Tipo.toLowerCase ();
        if((! Tipo.equals ("decimal"))&&(! Tipo.equals ("numeric")))
            throw new java.lang.Exception("Este e Atributo somente de Tipos Decimais de Precisão Arbitraria");
        this.Tipo="decimal";
    }
    
    /**
     * Atribui o Tamanho(Numero de Digitos) ao Atributo
     * @param Tamanho Numero Maximo de Digitos >0 
     * @throws java.lang.Exception Se Tamanho for menor que 0
     */
    public void setTamanho(int Tamanho) throws Exception
    {
        if(Tamanho<0)
            throw new java.lang.Exception("Tamanhos devem ser positivos");
        this.Tamanho=Tamanho;
    }
    
    /**
     * Atribui o Precisao(Numero de Digitos Decimais) ao Atributo
     * @param Precisao Numero Maximo de Digitos Decimais >0
     * @throws java.lang.Exception Se Tamanho for menor que 0
     */
    public void setPrecisao(int Precisao) throws Exception
    {
        if(Precisao<0)
            throw new java.lang.Exception("Precisoes devem ser positivos");
        this.Precisao=Precisao;
    }
    
    /**
     * Retorna Tamanho e Precisao formatados para o SGBD
     * @param SGBD Nome do SGBD a ser Utilizado
     * @throws java.lang.Exception Nunca
     * @return String com Tamanho e Precisao formatados para o SGBD
     */
    protected String getTamanhoSQL(String SGBD) throws Exception
    {
        if(this.Tamanho==0)
            return "";
        else if(this.Precisao==0)
            return "("+Tamanho+")";
        else
            return "("+Tamanho+","+Precisao+")";
    }

    
    /**
     * Retorna parte do SQL para criacao do Atributo para o SGBD especificado, 
     * sem o Nome do Atributo.
     * @param SGBD Nome do SGBD para o qual sera gerado o SQL
     * @return String SQL para cofiguracao do Atributo
     * @throws java.lang.Exception Se Atributo n�o possuir Nome ou Tipo, ou Padrao==NULL para Atributo NOT NULL
     */
    public String getInfoSQL(String SGBD) throws Exception
    {
        String Temp;
        String Retorno;

        // Nome e Tipo
        Retorno="\t"+this.getTipoSQL (SGBD)+this.getTamanhoSQL(SGBD);
        
        Temp=this.getUnsignedSQL (SGBD);
        if(Temp.length ()>0)
            Retorno+="\t"+Temp;
        
        Temp=this.getZerofillSQL (SGBD);
        if(Temp.length ()>0)
            Retorno+="\t"+Temp;
        
        Temp=this.getPadraoSQL (SGBD);
        if(Temp.length ()>0)
            Retorno+="\t"+Temp;
        
        Temp=this.getUnicoSQL (SGBD);
        if(Temp.length ()>0)
            Retorno+="\t"+Temp;
        
        Temp=this.getNuloSQL (SGBD);
        if(Temp.length ()>0)
            Retorno+="\t"+Temp;

        return Retorno;
        
    }
    
}